在第十三天時,我們曾認識了程式語言中,至關重要的物件——函式 Function,然而我們僅僅是概略地學習如何創建與使用函式,似乎好像無法深刻體悟函式究竟可以多厲害,以及為什麽函式在眾多程式語言中,都有著舉足輕重的地位。
今天要講的高階函式 Higher Order Functions 並非另一種形式的函式,而是函式在 Python 中是一種更高等級的存在,可以想像成「萬般皆下品,唯有函式高」的狀況,也因為這個狀況,函式也可以被稱作一等公民 First-class Citizen,一等公民所代表的意義,並非有數種其他不同等級的公民,而是意味著我們可以對函式這樣的一等公民對象進行以下操作:
在 Python 中,我們可以將函式當作參數 parameter 傳遞給另一個函式。
# 一個普通的函式
def sum_numbers(nums):
return sum(nums) # 使用內建的 sum 函式來計算總和
# 接受函式作為參數的高階函式
def higher_order_function(f, nums_list):
summation = f(nums_list)
return summation
result = higher_order_function(sum_numbers, [1, 2, 3, 4, 5])
print(result) # 15
在上面的範例中,我們可以看見 sum_numbers
是一個用來進行加總的函式,最後會返回串列加總後的結果。
接著來細看另一個名為 higher_order_function
的函式,它可以接收兩個參數,分別為 f
與 num_list
,從內容中的 summation = f(nums_list)
來看,可以推斷 summation
這個變數被賦值了一個 f(num_list)
的函式,然後我們把 sum_numbers
跟串列 [1, 2, 3, 4, 5]
分別帶入到 f
與 summation
中,會發現 f(nums_list)
變成了 sum_numbers([1, 2, 3, 4, 5])
,也就是調用了本來的 sum_numbers
函數。
在這個過程中,我們將 sum_numbers
函式作為參數傳遞給 higher_order_function
,並使用該函式來計算數字列表的總和,最後計算串列 [1, 2, 3, 4, 5]
,得到結果 15
。
我們也可以讓函式返回另一個函式,這樣就可以根據條件來動態選擇和執行不同的函式。
def square(x): # 一個平方函式
return x ** 2
def cube(x): # 一個立方函式
return x ** 3
def absolute(x): # 一個取絕對值的函式
if x >= 0:
return x
else:
return -(x)
def higher_order_function(type): # 一個高階函式,根據參數返回不同的函式
if type == 'square':
return square
elif type == 'cube':
return cube
elif type == 'absolute':
return absolute
result = higher_order_function('square')
print(result(3)) # 9
result = higher_order_function('cube')
print(result(3)) # 27
result = higher_order_function('absolute')
print(result(-3)) # 3
從上述範例中可以看到,高階函式會根據傳遞的參數來返回不同的函式。例如,當我們傳入 'square'
時,高階函式返回 square
函式,並將結果計算為 9;當傳入 'cube'
時,返回 cube
函式並計算為 27。
一開始我覺得高階函式是困難的概念,它很像在變魔術,把東西左放右放,突然就得到了另外一個東西,而要真的理解高階函式,不外乎就是一步一步地代入,然後得到最終的結果。